/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package core;


import protocol.*;
import java.util.*;

/**
 *
 * @author Marco
 */
public class BestFit {

    private ArrayList<Long> space;


    public TSServerInfo bestfit(int fileSize,List<TSServerInfo> tSServerInfos) {

        TSServerInfo min = null;
        for(TSServerInfo t : tSServerInfos) {
            if( min == null || t.getKeySize() < min.getKeySize())
                min = t;
        }
        synchronized(min){
            min.setKeySize(min.getKeySize()+1);
        }

        return min;
    }

    public void bestfit(List<TSFileTag> filetaglist,List<TSServerInfo> tSServerInfo){

        int i, j, pos = 0;
        long storefree = 0;
        space = new ArrayList<Long>();
        HashMap<TSFileTag,TSServerInfo> hash = new HashMap<TSFileTag,TSServerInfo>();

        for(i=0; i< tSServerInfo.size(); i++){  // cria lista com o espaço livre de cada server, a posiçao no array é a mm para permitir saber a qual pertence
            space.add(i, tSServerInfo.get(i).getAvailableSize());
        }

        for(i=0; i< filetaglist.size(); i++){
            for(j=0; j< space.size(); j++){  // percorre a list e guarda a posição que tem mais espaço livre
                if(space.get(j) > storefree){
                    storefree = space.get(j);
                    pos = j;
                }
            }
            if(filetaglist.get(i).getFileSize() < storefree){  // verifica se tem espaço, guarda na hash e subtrai o espaço livre ao array que controla os espaços
                hash.put(filetaglist.get(i), tSServerInfo.get(pos));
                space.add(pos, storefree-(filetaglist.get(i).getFileSize()));
            }
            else System.exit(0);  // como tratar caso nao haja expaço suficiente?!
        }
    }

}
